/**
 * 题解：
1）原地修改 不能new一个新的数组
2）操作后返回新数组的长度
3）在使用O（1）空间条件下完成，利用slow双指针slow、fast，起点相同遍历数组，如果两个指针指向的数组元素相同，fast前进。
  若两个指针指向的元素不同，slow前进并用fast元素覆盖(去重)。
  重复并满足fast小于数组长度，最后返回slow索引+1.
 */


let _ = {};

// indexOf
_.uniq1 = (target, callback) => {
  let result = [];
  let computed;

  for (let i = 0; i < target.length; i++) {
    computed = callback ? callback(target[i]) : target[i];
    if (result.indexOf(computed) === -1) {
      result.push(computed);
    }
  }
  return result;
}

// 快慢指针
_.uniq2 = (arr) => {
  arr.sort((a, b) => a - b)
  let [fast, slow] = [0, 0];
  while (fast < arr.length) {
    if (arr[fast] !== arr[slow]) {
      slow++;
      arr[slow] = arr[fast]
    }
    fast++;
  }
  return arr.slice(0, slow + 1);
}

// ES6常用
_.uniqV1 = arr => {
  return [...new Set(arr)];
  // return Array.from(new Set(arr))
}

_.uniq4 = (arr) => {
  // 返回当前元素在原始数组中的第一个索引==当前索引值的项即可
  return arr.filter((item, index, arr) => {
    return arr.indexOf(item, 0) === index;
  });
}

// ES5常用
_.uniq5 = arr => {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        j--;
      }
    }
  }
  return arr;
}


let arr = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 1, 2]


_.uniqV1 = arr => [...new Set(arr)];
_.uniqV1 = arr => Array.from(new Set(arr));
_.uniqV2 = arr => {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (res.indexOf(arr[i]) === -1) {
      res.push(arr[i]);
    }
  }
  return res;
}

_.uniqV3 = arr => arr.filter((item, index, arr) => {
  return arr.indexOf(item, 0) === index;
});

_.uniqV4 = arr => {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        j--;
      }
    }
  }
  return arr;
}

_.uniqV5 = arr => {
  arr.sort();
  // i 慢指针 j 快指针
  let [i, j] = [0, 0];
  while (j < arr.length) {
    if (arr[j] !== arr[i]) {
      i++;
      arr[i] = arr[j];
    }
    j++;
  }
  return arr.slice(0, i + 1)
}

console.log(_.uniqV1(arr), _.uniqV2(arr), _.uniqV3(arr), _.uniqV4(arr), _.uniqV5(arr));